package Java集合;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/*
    List接口概述
         鉴于Java中数组用来存储数据的局限性,通常使用List替代数组
         List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引
         List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
         JDK API中List接口的实现类常用的有:
            ArrayList:作为List接口的主要实现类,线程不安全的,效率高,底层使用Object[]存储
            LinkedList:底层使用双向链表存储,对于频繁的插入、删除操作,使用效率比ArrayList高
            Vector:最古老的实现类,线程安全的,效率低,底层使用Object[]存储,一般不使用

   ArrayList、LinkedList、Vector的异同? ArrayList底层是什么?扩容机制?Vector和ArrayList的最大区别?
        ArrayList和LinkedList的异同
              二者都线程不安全,相对线程安全的Vector,执行效率高
              ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构,对于随机访问get和set,ArrayList速度优于LinkedList,因为LinkedList要移动指针
              对于新增和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据
       ArrayList和Vector的区别
              Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于强同步类,因此开销就比ArrayList要大,访问要慢
              正常情况下,大多数的Java程序员使用 ArrayList而不是Vector,因为同步完全可以由程序员自己来控制
              Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍,Vector还有一个子类Stack

   List接口常用方法
        List除了从Collection集合继承的方法外,List集合里添加了一些根据索引来操作集合元素的方法
             void add(int index,Object ele):在index位置插入ele元素
             boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素添加进来
             Object get(int index):获取指定index位置的元素
             int indexOf(Object obj):返回obj在集合中首次出现的位置
             int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
             Object remove(int index):移除指定index位置的元素,并返回此元素
             Object set(int index,Object ele):设置指定index位置的元素为ele
             List subList(int fromIndex,int toIndex):返回从fromIndex到toIndex位置的子集合
 */
public class ListTest04 {

    @Test
    public void test1(){
        List list = new ArrayList<>();
        list.add("123");
        list.add(0);
        list.add(456);
        list.add("AA");
        list.add(new Person("Tom",12));
        list.add("BB");

        System.out.println(list);
    }
}
